<?php

/**
 * Atelier form.
 *
 * @package    tfe
 * @subpackage form
 * @author     Your name here
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class AtelierForm extends BaseAtelierForm {
    // intervalle de jours entre 2 seances d'ateliers
    private static $intervalle_jour_seance = 7;

    public function configure() {
        unset($this['created_at'], $this['updated_at'], $this['deleted_at'], $this['prix_reservation']);

        $this->widgetSchema['commentaire'] =  new sfWidgetFormCKEditor(array('jsoptions'=>array('toolbar'=>'Full','skin'=>'kama', 'height'=>'300')));

        $this->widgetSchema['animateur']->setOption('renderer_class', 'sfWidgetFormDoctrineJQueryAutocompleter');
        $this->widgetSchema['animateur']->setOption('renderer_options', array(
                'model' => 'Animateur',
                'url'   => '/animateur/autocomplete',
        ));

    }

    // Surcharge de la méthode save() afin d'appliquer le pattern de récurrence des scéances
    public function save($con = null) {

        $atelier=parent::save();
        if (!is_null($atelier)) {
            // TODO : supprimer les dates existantes précédemment, mais postérieures à aujourd'hui !
            Doctrine_Core::getTable('Evenement')->createQuery()
                    ->delete()
                    ->where('id_atelier = ?', $atelier->getId())
                    ->andWhere('date >= ?', date('Y-m-d'))
                    ->execute();


            // calculer les dates selon le jour de la semaine entré
            // correspondance français/anglais
            $days = array ('dimanche'=>'Sun','lundi'=>'Mon','mardi'=>'Tue','mercredi'=>'Wed','jeudi'=>'Thu','vendredi'=>'Fri','samedi'=>'Sat');
            $decalage_jour = 0;
            $decalage_mois = 0;

            // à partir du jour courant, trouver le décalage avec le jour voulu
            for($i=0;$i<7;$i++) {
                if($days[$atelier->jour] == date('D', mktime(0, 0, 0, date("m")  , date("d")+$i, date("Y")))) {
                    $decalage_jour = $i;
                }
            }

            // ne pas remplir juillet, aout et septembre
            switch (date('m')) {
                case 7: $decalage_mois = 3;
                    break;
                case 8: $decalage_mois = 2;
                    break;
                case 9: $decalage_mois = 1;
                    break;
                default: break;
            }

            // boucler pour générer tous les évènements
            $idx_jour=0;

            // boucle juqu'à juillet
            while( date(date('m', mktime(0, 0, 0, date("m") + $decalage_mois  , date("d") + $decalage_jour + $idx_jour, date("Y"))) != 7 )) {
                $seance = new SeanceAtelier();
                $seance->setDate(date('Y-m-d', mktime(0, 0, 0, date("m") + $decalage_mois  , date("d") + $decalage_jour + $idx_jour, date("Y"))));
                $seance->setIdAtelier($atelier->getId());
                $seance->setLibelle($atelier->getLibelle());
                $seance->setHeureDeDebut($atelier->getHeureDeDebut());
                $seance->setHeureDeFin($atelier->getHeureDeFin());
                $seance->setCommentaire($atelier->getCommentaire());
                $seance->setLieu($atelier->getLieu());
                $seance->setType('atelier');
                $seance->save();

                $idx_jour += self::$intervalle_jour_seance;
            }

            // idem pour jour2
            // à partir du jour courant, trouver le décalage avec le jour voulu
            if($atelier->getJour2()) {
                for($i=0;$i<7;$i++) {
                    if($days[$atelier->jour2] == date('D', mktime(0, 0, 0, date("m")  , date("d")+$i, date("Y")))) {
                        $decalage_jour = $i;
                    }
                }

                // ne pas remplir juillet, aout et septembre
                switch (date('m')) {
                    case 7: $decalage_mois = 3;
                        break;
                    case 8: $decalage_mois = 2;
                        break;
                    case 9: $decalage_mois = 1;
                        break;
                    default: break;
                }

                // boucler pour générer tous les évènements
                $idx_jour=0;

                // boucle juqu'à juillet
                while( date(date('m', mktime(0, 0, 0, date("m") + $decalage_mois  , date("d") + $decalage_jour + $idx_jour, date("Y"))) != 7 )) {
                    $seance = new SeanceAtelier();
                    $seance->setDate(date('Y-m-d', mktime(0, 0, 0, date("m") + $decalage_mois  , date("d") + $decalage_jour + $idx_jour, date("Y"))));
                    $seance->setIdAtelier($atelier->getId());
                    $seance->setLibelle($atelier->getLibelle());
                    $seance->setHeureDeDebut($atelier->getHeureDeDebut2());
                    $seance->setHeureDeFin($atelier->getHeureDeFin2());
                    $seance->setCommentaire($atelier->getCommentaire());
                    $seance->setLieu($atelier->getLieu());
                    $seance->setType('atelier');
                    $seance->save();

                    $idx_jour += self::$intervalle_jour_seance;
                }

                // idem pour jour3
                // à partir du jour courant, trouver le décalage avec le jour voulu
                if($atelier->getJour2()) {
                    for($i=0;$i<7;$i++) {
                        if($days[$atelier->jour3] == date('D', mktime(0, 0, 0, date("m")  , date("d")+$i, date("Y")))) {
                            $decalage_jour = $i;
                        }
                    }

                    // ne pas remplir juillet, aout et septembre
                    switch (date('m')) {
                        case 7: $decalage_mois = 3;
                            break;
                        case 8: $decalage_mois = 2;
                            break;
                        case 9: $decalage_mois = 1;
                            break;
                        default: break;
                    }

                    // boucler pour générer tous les évènements
                    $idx_jour=0;

                    // boucle juqu'à juillet
                    while( date(date('m', mktime(0, 0, 0, date("m") + $decalage_mois  , date("d") + $decalage_jour + $idx_jour, date("Y"))) != 7 )) {
                        $seance = new SeanceAtelier();
                        $seance->setDate(date('Y-m-d', mktime(0, 0, 0, date("m") + $decalage_mois  , date("d") + $decalage_jour + $idx_jour, date("Y"))));
                        $seance->setIdAtelier($atelier->getId());
                        $seance->setLibelle($atelier->getLibelle());
                        $seance->setHeureDeDebut($atelier->getHeureDeDebut3());
                        $seance->setHeureDeFin($atelier->getHeureDeFin3());
                        $seance->setCommentaire($atelier->getCommentaire());
                        $seance->setLieu($atelier->getLieu());
                        $seance->setType('atelier');
                        $seance->save();

                        $idx_jour += self::$intervalle_jour_seance;
                    }
                } else {
                    throw new Exception('Atelier non trouve');
                }
                return $atelier;
            }

        }
    }
}



